package util;

import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
import entity.Poem;
import org.junit.Test;

import java.io.*;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public abstract class JsonUtil<T> {

    /**
     * 获得 T.class
     * @return
     */
    protected Class getClazz(){
        Type genType = getClass().getGenericSuperclass();
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
        return (Class)params[0];
    }

    /**
     * 解析单个json文件成 List<T>
     * @param filePath 指定json文件的路径
     * @return
     */
   public List<T> parse(String filePath){
       JsonParser parse =new JsonParser();  //创建json解析器

       JsonArray jsonArray= null;

       List<T> list = new ArrayList<T>();

        Gson gson = new Gson();
        try {
            jsonArray = (JsonArray) parse.parse(new FileReader(filePath));
            for(JsonElement jsonElement:jsonArray){
                T t = (T) gson.fromJson(jsonElement,getClazz());
                list.add(t);
            }
            return list;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
   }

    /**
     * 将List<T>转为Json字符串
     * @param c
     * @return
     */
   public String toJsonString(Collection<T> c){
       Gson gson = new Gson();
       String s = gson.toJson(c);
       return s;
   }

    /**
     * 将Json字符串保存到本地文件
     * @param jsonString
     * @param filePath
     * @return
     */
   public boolean save2File(String jsonString,String filePath){
       File file = new File(filePath);
       if (file.exists()) { // 如果已存在,删除旧文件
           file.delete();
           System.err.println("文件已存在，已删除旧文件！");
       }
       try {
           file.createNewFile();
           Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
           write.write(jsonString);
           write.flush();
           write.close();
           return true;
       } catch (IOException e) {
           e.printStackTrace();
       }
       return false;
   }
}
